package com.baidu.service.impl;

import com.baidu.constant.MyException;
import com.baidu.constant.POIUtils;
import com.baidu.dao.OrdersettingDao;
import com.baidu.pojo.OrderSetting;
import com.baidu.service.OrdersettingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

@Service
public class OrdersettingServiceImpl implements OrdersettingService {

    @Autowired
    private OrdersettingDao ordersettingDao;

    @Override
    @Transactional
    public boolean upload(MultipartFile excelFile) {

        // 设置日期格式
        SimpleDateFormat dateFormat = new SimpleDateFormat(POIUtils.DATE_FORMAT);

        // 转成List<OrderSetting>实体类，
        List<OrderSetting> orderSettingList = new ArrayList<>();

        List<String[]> readExcel = null;
        try {
            // 解析Excel文件
            readExcel = POIUtils.readExcel(excelFile);
            for (String[] strings : readExcel) {
                String date = strings[0];
                String number = strings[1];

                OrderSetting os = new OrderSetting(dateFormat.parse(date), Integer.parseInt(number));
                orderSettingList.add(os);
            }
            // 调用方法检查通过后则插入数据
            findByOrderDate(orderSettingList);

        } catch (IOException | ParseException e) {
            e.printStackTrace();
        }
        return true;
    }

    @Override
    public void findByOrderDate(List<OrderSetting> orderSettings){

        // 遍历orderSettings, 用将要插入的日期去查询数据库, 通过预约日期查询是否存在预约设置信息
        for (OrderSetting orderSetting : orderSettings) {
            System.out.println(orderSetting.getOrderDate());
            // 查询数据库, 判断
            OrderSetting osInDB = ordersettingDao.findByOrderDate(orderSetting.getOrderDate());
            // 如果存在, 要判断已预约数是否大于最大预约数（即将更新的）, 如果大于则报错。
            if (osInDB != null){

                // 判断已预约人数 是否大于 即将更新发最大预约数.
                int osInDBReservations = osInDB.getReservations(); // 数据库中的已预约数
                int number = orderSetting.getNumber();  // 即将要添加的最大预约数
                if (osInDBReservations > number){
                    throw new MyException("已预约人数不能大于最大预约数");
                }else {
                    // 小于或等于，则更新最大预约数
                    ordersettingDao.update(orderSetting);
                }
            }
            // 如果不存在, 则更新记录.
            ordersettingDao.add(orderSetting);
        }
    }
}
